package com.cxx.home.schedule;

import com.cxx.home.entity.Task;
import com.cxx.framework.web.CustomException;
import org.quartz.*;
import org.springframework.stereotype.Component;

@Component
public class QuartzUtils {
    public static JobDetail getJobDetail(Task task, JobKey jobKey) {
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("id", task.getId());
        jobDataMap.put("type", task.getType());
        jobDataMap.put("content", task.getContent());

        return JobBuilder.newJob(QuartzJob.class)
                .withIdentity(jobKey)  // 使用 id 作为唯一标识
                .usingJobData(jobDataMap)
                .build();
    }

    public static Trigger getTrigger(Task task, JobKey jobKey) {
        Trigger trigger;
        // 判断任务类型：Cron 任务或者一次性任务
        if (task.getCronExpression() != null && !task.getCronExpression().isEmpty()) {
            // 定时任务：使用 Cron 表达式
            trigger = TriggerBuilder.newTrigger()
                    .withIdentity(jobKey.getName() + "Trigger")
                    .withSchedule(CronScheduleBuilder.cronSchedule(task.getCronExpression()))
                    .forJob(jobKey)
                    .build();
        } else if (task.getExecuteTime() != null) {
            // 一次性任务：使用 executeTime
            trigger = TriggerBuilder.newTrigger()
                    .withIdentity(jobKey.getName() + "Trigger")
                    .startAt(task.getExecuteTime())
                    .forJob(jobKey)
                    .build();
        } else {
            // 如果没有 Cron 表达式和 executeTime，任务不能调度，抛出异常
            throw new CustomException("任务没有有效的 Cron 表达式或执行时间");
        }

        return trigger;
    }
}

